#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "ReadFile.h"
#include "CFLRU.h"


#define SEC_PRE_PAGE 4
int main()
{
    /*关于文件读取操作的变量*/
    UINT8  szFileName[256] = {0};     // 包含完整路径的文件名
    FILE  *fp= NULL;    // 文件句柄
    UINT8  szRecordSet[MAX_RECORD_LEN] = {0};   // 存放从文件中读取到的记录内容集
    UINT8  szRecordInfo[MAX_RECORD_LEN] = {0};   // 存放从文件中读取到的每条记录内容
    int iRetVal=0;
    //关于trace的文件变量
    double time;
    int devno,Opera_flag,secno,scount;
    /**************************************/

//    添加相关的初始化函数

    /**************************************/
    // 获取包含完整路径的文件名
    //szFileName是打开的文件绝对路径
    //自定义加入文件的路径
    printf("Input trace file path\n");
    fgets(szFileName,256,stdin);
    //处理掉输入的换行符
    int L=strlen(szFileName);
    if (L>0)
    {
        if (szFileName[L-1]=='\n' || szFileName[L-1]=='\t')
        {
            szFileName[L-1]='\0';
        }
        L--;
    }
    // 打开文件
    fp = fopen(szFileName, "r");
    if (NULL == fp)   // 打开失败
    {
        printf("Open file %s failed!\n", szFileName);
        return -1;
    }else
    {
        printf("Open file %s success!\n",szFileName);
    }
    //test point

    //加入对缓冲区链表的初始化操作

    while (1)
    {
        //利用函数memset快速置位
        memset(szRecordSet, 0x00, sizeof(szRecordSet));

        iRetVal = ReadRecordFromFile(fp, szRecordSet);
        if (iRetVal == -1)   // 表示函数执行失败, 直接退出
        {
            printf("Exec ReadRecordFromFile failed, please check!\n");
            break;
        }
        else if (iRetVal == 1)
        {
            printf("the file %s read finished\n",szFileName);
            PrintResultStat();
            break;
        }else
        {
            //打印输出读取到的记录值
            memset(szRecordInfo,0x00,sizeof(szRecordInfo));
            strncpy(szRecordInfo, szRecordSet, sizeof(szRecordInfo)-1);
            //开始操作处理数据
            if (sscanf(szRecordInfo, "%lf %d %d %d %d\n", &time, &devno, &secno, &scount, &Opera_flag) == 0)
            {
                fprintf(stderr, "Wrong number of arguments for I/O trace event type\n");
                fprintf(stderr, "szRecordInfo: %s", szRecordInfo);
                break;
            }
//           printf("%s\n", szRecordInfo);
//         这里开始穿插对缓冲区算法的研究仿真代码
//            printf("secno:%d\t scount:%d\t Opera_flag:%d\n",secno,scount,Opera_flag);
//         扇区请求进行对齐处理
            CacheManage(secno,scount,Opera_flag);
        }
    }

//    FreeVariable();
    FreeList(&Head);
    //关闭文件
    fclose(fp);
    return 0;
}

